﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ShowDBPool
{
    /// <summary>
    /// ObjectPool类的子类，用于包装用户自定义对象
    /// 这个类，一个关键的属性是Using，该属性表示对象是否正在被被用户使用。
    /// 注意，PoolItem创建时，接受一个Object类型的Param参 数，这个参数最后被传递给用户自定义对象的Create方法。
    /// 用户可以利用这一点，在创建ObjectPool时指定一些参数，供其自定义对象在创建时使 用。
    /// 比如创建SocketPool时，将服务器IP，端口通过Param传递给自定义对象的Create方法，用户就可以在Create方法中连接指定的 服务器了。
    /// </summary>
    public class PoolItem
    {
        private IDynamicObject _object;
        private bool _bUsing;
        private Type _type;
        private Object _CreateParam;

        public PoolItem(Type type, Object param)
        {
            _type = type;
            _CreateParam = param;
            Create();
        }

        private void Create()
        {
            _bUsing = false;
            _object = (IDynamicObject)System.Activator.CreateInstance(_type);
            _object.Create(_CreateParam);
        }

        public void Recreate()
        {
            _object.Release();
            Create();
        }

        public void Release()
        {
            _object.Release();
        }

        public Object InnerObject
        {
            get { return _object.GetInnerObject(); }
        }

        public int InnerObjectHashcode
        {
            get { return InnerObject.GetHashCode(); }
        }

        public bool IsValidate
        {
            get { return _object.IsValidate(); }
        }

        public bool Using
        {
            get { return _bUsing; }
            set { _bUsing = value; }
        }
    }// class PoolItem
}
